//我们提供了一个类： 
//
// 
//public class Foo {
// public void first() { print("first"); }
// public void second() { print("second"); }
// public void third() { print("third"); }
//} 
//
// 三个不同的线程 A、B、C 将会共用一个 Foo 实例。 
//
// 
// 一个将会调用 first() 方法 
// 一个将会调用 second() 方法 
// 还有一个将会调用 third() 方法 
// 
//
// 请设计修改程序，以确保 second() 方法在 first() 方法之后被执行，third() 方法在 second() 方法之后被执行。 
//
// 
//
// 示例 1: 
//
// 
//输入: [1,2,3]
//输出: "firstsecondthird"
//解释: 
//有三个线程会被异步启动。
//输入 [1,2,3] 表示线程 A 将会调用 first() 方法，线程 B 将会调用 second() 方法，线程 C 将会调用 third() 方法。
//正确的输出是 "firstsecondthird"。
// 
//
// 示例 2: 
//
// 
//输入: [1,3,2]
//输出: "firstsecondthird"
//解释: 
//输入 [1,3,2] 表示线程 A 将会调用 first() 方法，线程 B 将会调用 third() 方法，线程 C 将会调用 second() 方法。
//正确的输出是 "firstsecondthird"。 
//
// 
//
// 提示： 
//
// 
// 尽管输入中的数字似乎暗示了顺序，但是我们并不保证线程在操作系统中的调度顺序。 
// 你看到的输入格式主要是为了确保测试的全面性。 
// 
// 👍 257 👎 0

package leetcode.editor.cn;

import java.util.concurrent.ArrayBlockingQueue;

/**
 * Java：按序打印
 *
 * @author changgui
 */
@SuppressWarnings("all")
public class P1114_PrintInOrder {
    public static void main(String[] args) {
        // TODO 此处开始你的表演

    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Foo {

        ArrayBlockingQueue<String> queue1;
        ArrayBlockingQueue<String> queue2;

        public Foo() {
            queue1 = new ArrayBlockingQueue<>(1);
            queue2 = new ArrayBlockingQueue<>(1);
        }

        public void first(Runnable printFirst) throws InterruptedException {
            // printFirst.run() outputs "first". Do not change or remove this line.
            printFirst.run();
            queue1.put("s");
        }

        public void second(Runnable printSecond) throws InterruptedException {
            queue1.take();
            // printSecond.run() outputs "second". Do not change or remove this line.
            printSecond.run();
            queue2.put("s");
        }

        public void third(Runnable printThird) throws InterruptedException {
            queue2.take();
            // printThird.run() outputs "third". Do not change or remove this line.
            printThird.run();
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}